{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 新建头文件"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 文件命名规范：代码文件名通常采用全小写形式，不需要使用大小写混合\n",
    "- 头文件创建：在项目中需要新建头文件时，应选择\"添加新项\"→\"头文件(.h)\"选项\n",
    "- 配套文件：每个头文件通常需要对应一个源文件(.cpp)，两者应保持相同的基础名称"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 头文件保护机制"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- `pragma once`：Visual Studio环境下防止头文件重复包含的指令\n",
    "- 跨平台方案：更通用的方法是使用条件编译指令：\n",
    "- 命名注意事项：宏定义名称(如`THREADPOOL_H`)应确保拼写正确且唯一"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线程池类设计"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 核心类抽象：\n",
    "  - `ThreadPool`类：作为线程池的主类(`Class ThreadPool`)\n",
    "  - `Thread`类：表示池中的单个线程(`Class Thread`)\n",
    "- 设计原则：先确定需要抽象的核心类型，再逐步填充具体实现细节\n",
    "- 模式选择：线程池支持两种工作模式：\n",
    "  - Fixed模式(默认)：固定线程数量\n",
    "  - Cached模式：线程数量可动态增长"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 需要抽象的类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "需要抽象的类型\n",
    "\n",
    "- 两种模式：\n",
    "  - 固定模式(Fixed): 线程数量固定不变，初始化后不再增减\n",
    "  - 缓存模式(Cached): 线程数量可动态增长，根据任务量自动调整\n",
    "- 实现方式：通过枚举类型`PoolMode`定义，包含`MODE_FIXED`和`MODE_CACHED`两个枚举值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程类型\n",
    "\n",
    "- 抽象基类设计：使用`class Thread`作为线程基类\n",
    "- 关键方法：包含线程启动、运行等基本接口"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池类型: 线程列表 \n",
    "\n",
    "- 容器选择：使用`std::vector`存储线程指针\n",
    "- 存储方式：存储线程指针而非对象，避免拷贝问题\n",
    "- 线程安全：固定模式下无需考虑线程安全，缓存模式需要考虑"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池类型: 任务队列 \n",
    "\n",
    "- 基类设计：\n",
    "  - 抽象基类`Task`：包含纯虚函数`virtual void run() = 0`\n",
    "  - 多态实现：用户自定义任务需继承`Task`并重写`run`方法\n",
    "- 智能指针应用：\n",
    "  - 使用`std::shared_ptr<Task>`管理任务生命周期\n",
    "  - 避免用户传入临时对象导致的生命周期问题\n",
    "- 队列实现：使用`std::queue`容器存储任务智能指针"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池类型: 任务数量 \n",
    "\n",
    "- 计数方式：使用`std::atomic_int`实现线程安全计数\n",
    "- 阈值设置：定义`taskQueMaxThreshHold`限制最大任务数\n",
    "- 内存考虑：每个任务都会占用内存，需限制最大数量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "任务队列的线程安全 \n",
    "\n",
    "- 互斥锁：使用`std::mutex`保证任务队列操作的原子性\n",
    "- 应用场景：用户线程提交任务和线程池消费任务都需要加锁"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "条件变量 \n",
    "\n",
    "- 两种条件变量：\n",
    "  - `notFull`：任务队列未满，允许用户提交新任务\n",
    "  - `notEmpty`：任务队列不空，允许线程池消费任务\n",
    "- 通信机制：协调生产者和消费者线程的工作节奏\n",
    "- 实现方式：使用`std::condition_variable`实现线程间通信"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线程池类的设计"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池类的设计\n",
    "\n",
    "- 线程管理:\n",
    "  - `std::vector<Thread*> threads_`: 存储线程指针的容器，表示线程池中的工作线程列表\n",
    "  - `int initThreadSize_`: 初始线程数量，建议根据CPU核心数设置（C++11提供相关接口获取）\n",
    "- 任务队列:\n",
    "  - `std::queue<std::shared_ptr<Task>> taskQue_`: 任务队列，存储待执行的共享指针任务对象\n",
    "  - `std::atomic_int taskSize_`: 原子变量记录当前任务数量\n",
    "  - `int taskQueMaxThreshHold_`: 任务队列最大容量阈值（默认1024）\n",
    "- 同步机制:\n",
    "  - `std::mutex taskQueMtx_`: 互斥锁保证任务队列线程安全\n",
    "  - `std::condition_variable notFull_`: 条件变量标识队列未满\n",
    "  - `std::condition_variable notEmpty_`: 条件变量标识队列非空"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "生产者-消费者模型\n",
    "\n",
    "- 角色划分:\n",
    "  - 生产者: 用户线程通过`submitTask`提交任务\n",
    "  - 消费者: 线程池内部工作线程从队列获取任务执行\n",
    "- 通信机制:\n",
    "  - 使用`notFull`条件变量控制生产者写入（队列满时等待）\n",
    "  - 使用`notEmpty`条件变量控制消费者读取（队列空时等待）\n",
    "  - 互斥锁`taskQueMtx_`保护共享资源（任务队列）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "编码规范\n",
    "\n",
    "- 命名规则:\n",
    "  - 采用驼峰式命名（首字母大写）或Unix风格（全小写下划线连接）\n",
    "  - 避免下划线前缀（可能与C++库符号冲突）\n",
    "  - 示例：`taskQueMaxThreshHold_`（驼峰+后缀下划线）\n",
    "- 设计要点:\n",
    "  - 变量命名需\"见名知意\"（如`initThreadSize_`明确表示初始线程数）\n",
    "  - 条件变量命名应体现状态语义（`notFull/notEmpty`）\n",
    "  - 原子变量`taskSize_`确保任务计数的线程安全"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线程池类的构造"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 基本结构：线程池类包含线程列表、任务队列和相关控制变量\n",
    "- 核心成员变量：\n",
    "  - `std::vector<Thread*> threads_`：存储线程指针的容器\n",
    "  - `int initThreadSize_`：初始线程数量\n",
    "  - `std::queue<std::shared_ptr<Task>> taskQue_`：任务队列\n",
    "  - `std::atomic_int taskSize_`：当前任务数量\n",
    "  - `int taskQueMaxThreshHold_`：任务队列最大阈值\n",
    "  - `std::mutex taskQueMtx_`：保证任务队列线程安全的互斥锁\n",
    "  - `std::condition_variable notFull_和notEmpty_`：任务队列状态条件变量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池模式设置\n",
    "\n",
    "- 模式枚举：使用C++11的enum class定义线程池工作模式\n",
    "  - `MODE_FIXED`：固定线程数量模式（默认）\n",
    "  - `MODE_CACHED`：线程数量可动态增长模式\n",
    "- 模式设置方法：\n",
    "  - `void setMode(PoolMode mode)`：设置线程池工作模式\n",
    "  - 实现要点：使用enum class避免不同枚举类型间的命名冲突"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池启动方法\n",
    "\n",
    "- 核心方法：\n",
    "  - `void start()`：启动线程池\n",
    "  - 功能：根据设置的模式初始化并启动线程\n",
    "- 工作模式特点：\n",
    "  - `FIXED`模式：线程数量固定，通常根据CPU核心数设置\n",
    "  - `CACHED`模式：线程数量动态增长，但有上限阈值；空闲线程超过60秒自动回收"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "任务提交接口\n",
    "\n",
    "- 任务提交：\n",
    "  - `Result submitTask(std::shared_ptr<Task> task)`：提交异步处理任务\n",
    "  - 返回值：`Result`对象用于获取任务执行结果\n",
    "- 线程同步机制：\n",
    "  - 使用`mutex`和`condition_variable`实现线程间同步\n",
    "  - 基于C++17的`any`和C++20的`semaphore`实现任务结果传递"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池析构\n",
    "\n",
    "- 析构函数：\n",
    "  - `~ThreadPool()`：负责资源清理\n",
    "  - 功能：释放线程资源，确保任务队列中的任务完成或妥善处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 驱动测试"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```shell\n",
    "sudo apt-get install libgmock-dev\n",
    "sudo apt-get install libgtest-dev\n",
    "```"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
